import { defineStore } from 'pinia'
import { ref } from 'vue'

/**
 * useAuthStore 是一个使用 Pinia 定义的存储模块，用于存储和管理用户认证相关的信息。
 * 它提供了存储和更新 token、用户信息、菜单列表、按钮列表等功能，以及一些操作方法，如清除认证信息和页面跳转。
 *
 * @function
 * @returns {Object} 包含以下属性和方法的对象：
 * @returns {Ref<string>} token - 存储在会话存储中的 token，使用 useSessionStorage 存储。
 * @returns {Ref<Object>} userInfo - 存储在会话存储中的用户信息，使用 useSessionStorage 存储。
 * @returns {Ref<Array>} menuList - 存储在会话存储中的菜单列表，使用 useSessionStorage 存储。
 * @returns {Ref<Array>} buttonList - 存储在响应式引用中的按钮列表，初始值为一个空数组。
 * @returns {function} setToken - 设置 token 的值。
 * @returns {function} setUserInfo - 设置用户信息的值。
 * @returns {function} setMenuList - 设置菜单列表的值。
 * @returns {function} setButtonList - 设置按钮列表的值。
 * @returns {function} setOpenId - 设置 openId 的值。
 * @returns {function} clearAuth - 清除认证信息，将 token、userInfo、menuList 和 buttonList 的值重置。
 * @returns {function} toIndexPage - 跳转到首页，根据不同情况进行跳转或显示提示。
 * @returns {function} toLoginPage - 跳转到登录页面，同时清除认证信息。
 */
export const useAuthStore = defineStore('auth', () => {
	/**
	 * 存储在会话存储中的 token，使用 ref 存储，初始值为空字符串。
	 */
	const token = ref('')

	/**
	 * 设置 token 的值。
	 *
	 * @param {string} data - 要设置的新 token 值。
	 */
	function setToken(data) {
		token.value = data
	}

	/**
	 * 存储在会话存储中的用户信息，初始值为一个空对象。
	 */
	const userInfo = ref({})

	/**
	 * 设置用户信息的值。
	 *
	 * @param {Object} data - 要设置的新用户信息。
	 */
	function setUserInfo(data) {
		userInfo.value = data
	}

	/**
	 * 存储在会话存储中的菜单列表，初始值为一个空数组。
	 */
	const menuList = ref([])

	/**
	 * 设置菜单列表的值。
	 *
	 * @param {Array} data - 要设置的新菜单列表。
	 */
	function setMenuList(data) {
		menuList.value = data
	}

	/**
	 * 存储在响应式引用中的按钮列表，初始值为一个空数组。
	 */
	const buttonList = ref([])

	/**
	 * 设置按钮列表的值。
	 *
	 * @param {Array} data - 要设置的新按钮列表。
	 */
	function setButtonList(data) {
		buttonList.value = data
	}

	/**
	 * 存储在响应式引用中的 openId，初始值为空字符串。
	 */
	const openId = ref('')

	/**
	 * 设置 openId 的值。
	 *
	 * @param {string} data - 要设置的新 openId 值。
	 */
	function setOpenId(data) {
		openId.value = data
	}

	/**
	 * 清除认证信息，将 token、userInfo、menuList 和 buttonList 的值重置为初始状态。
	 */
	function clearAuth() {
		token.value = ''
		userInfo.value = {}
		menuList.value = []
		buttonList.value = []
	}

	/**
	 * 跳转到首页，根据不同情况进行跳转或显示提示。
	 * 如果菜单列表不为空，直接跳转到首页；如果用户是管理员，也跳转到首页；否则显示无权限的提示。
	 */
	function toIndexPage() {
		if (menuList.value.length) {
			uni.reLaunch({
				url: '/pages/index/Index'
			})
		} else {
			if (userInfo.value.isAdmin === '1') {
				uni.reLaunch({
					url: '/pages/index/Index'
				})
			} else {
				uni.showToast({
					title: '您暂无权限，请联系管理员'
				})
			}
		}
	}

	/**
	 * 跳转到登录页面，同时清除认证信息。
	 */
	function toLoginPage() {
		clearAuth()
		uni.reLaunch({
			url: '/pages/login/Login'
		})
	}

	return {
		token,
		userInfo,
		menuList,
		buttonList,
		setToken,
		setUserInfo,
		setMenuList,
		setButtonList,
		setOpenId,
		toIndexPage,
		toLoginPage
	}
})
